// ImageStorageManager.h
#pragma once

#include <string>
#include <thread>
#include <mutex>
#include <atomic>
#include <queue>
#include <map>
#include <condition_variable>
#include "CHVisionAdvX.h"

class ImageStorageManager
{
public:
    // 删除规则配置
    struct DeleteRule {
        bool enabled = true;
        int max_days = 7;           // 检测时间 > 7天
        long long max_total_size = 10LL * 1024 * 1024 * 1024; // 文件总大小 > 10G (10GB)
    };

    // 存图规则配置
    struct StorageRule {
        bool enabled = true;        // 存图开关
        bool single_folder = true;  // 单文件夹模式（覆盖）
        enum StorageMode {
            SINGLE_FOLDER,          // 单文件夹模式（覆盖）
            TIMESTAMP_FOLDERS,      // 时间戳文件夹模式
            BOTH_MODES              // 两种模式共存
        };
        StorageMode storage_mode = SINGLE_FOLDER;  // 存储模式
    };

    // 存图任务
    struct StorageTask {
        enum TaskType {
            STORAGE_IMAGE3D,
            STORAGE_DEFECT_PLATE
        };

        TaskType type;
        s_Image3dS image3d_data;
        s_DefectPlateBRtsPara defect_data;
        std::string folder_path;
        std::string name;
    };

    // 获取单例实例
    static ImageStorageManager& getInstance();

    // 初始化配置
    void initialize(const std::string& base_storage_path,
                    const DeleteRule& delete_rule,
                    const StorageRule& storage_rule);

    // 设置存图开关
    void setStorageEnabled(bool enabled);

    // 添加存图任务
    void addImage3dTask(const s_Image3dS& image_data, const std::string& name);
    void addDefectPlateTask(const s_DefectPlateBRtsPara& defect_data, const std::string& name);

    // 获取当前存储状态
    long long getCurrentStorageSize() const;
    int getPendingTaskCount() const;

    // 停止存储管理器
    void shutdown();

private:
    ImageStorageManager();
    ~ImageStorageManager();

    // 禁止拷贝
    ImageStorageManager(const ImageStorageManager&) = delete;
    ImageStorageManager& operator=(const ImageStorageManager&) = delete;

    // 工作线程函数
    void storageWorkerThread();

    // 生成时间戳文件夹名
    std::string generateTimestampFolderName();

    // 执行存图任务
    void executeStorageTask(const StorageTask& task);

    // 清理过期文件
    void cleanupExpiredFiles();

    // 计算文件夹大小
    long long calculateFolderSize(const std::string& folder_path);

    // 删除文件夹
    bool deleteFolder(const std::string& folder_path);

private:
    std::string base_storage_path_;     // 基础存储路径
    DeleteRule delete_rule_;           // 删除规则
    StorageRule storage_rule_;         // 存图规则

    std::atomic<bool> is_running_;     // 运行状态
    std::atomic<bool> storage_enabled_; // 存图开关

    std::queue<StorageTask> task_queue_;           // 任务队列
    mutable std::mutex queue_mutex_;               // 队列互斥锁 (改为 mutable)
    std::condition_variable queue_condition_;      // 队列条件变量

    std::thread worker_thread_;                    // 工作线程

    std::atomic<long long> current_storage_size_;  // 当前存储大小
};
